#include <iostream>

using namespace std;

//构造函数的分类及调用
//两种分类方式
//按参数分为: 有参构造和无参构造
//按类型分为: 普通构造和拷贝构造
//三种调用方式
//1、括号法
//2、显示法
//3、隐式转换法
class Person {
public:
    int age;
public:
    Person() {//无参构造
        cout << "无参构造函数的调用!" << endl;
    }

    Person(int a) {//有参构造
        this->age = a;
        cout << "有参构造函数的调用!" << endl;
    }

    Person(const Person &person) {//拷贝构造
        this->age = person.age;
        cout << "拷贝构造函数的调用!" << endl;
    }

    ~Person() {//析构函数
        cout << "析构函数的调用!" << endl;
    }
};

void test() {
    //1、括号法
    //注意事项：调用默认构造函数时候，不要加()，编译器会认为是一个函数的声明,不会认为在创建对象
    Person p1;//无参构造函数的调用
    Person p2(10);//有参构造函数的调用
    Person p3(p2);//拷贝构造函数的调用
    cout << "p2:age=" << p2.age << endl;
    cout << "p3:age=" << p3.age << endl;
    cout << "=========" << endl;
    //2、显示法
    //注意事项：不要利用拷贝构造函数初始化匿名对象
    Person person1 = Person();//无参构造函数的调用
    Person person2 = Person(10);//有参构造函数的调用
    Person person3 = Person(person2);//拷贝构造函数的调用
    //Person(10)；//匿名对象 特点:当前行执行结束后，系统会立即回收掉匿名对象
    cout << "=========" << endl;
    //3、隐式转换法
    Person person4 = 10;//相当于 写了Person person4 = Person(10); 有参构造
    Person person5 = person4;//相当于 写了Person person5 = Person(person4); 拷贝构造
    cout << "=========" << endl;
}

int main() {
    test();
    return 0;
}

